/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ik.pbs.Manejadores;

/**
 *
 * @author alexis
 */
import com.ik.pbs.Encapsulados.Usuarios;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class ManejadorUsuarios {

    public static ManejadorUsuarios manager = null;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
    private SimpleDateFormat shf = new SimpleDateFormat("HH:mm:ss");

    public static ManejadorUsuarios getInstance() {
        if (manager == null) {
            manager = new ManejadorUsuarios();
        }

        return manager;
    }

    public void ManejadorUsuarios() {
    }
    public ArrayList<Usuarios> getUsuariosTop10(Connection con) {
        ArrayList<Usuarios> arregloUsuarios = new ArrayList();

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from usuarios where perfil > 1 order by (puntospositivos-puntosnegativos) DESC limit 10";

        try {
            state = con.prepareCall(query);
            rd = state.executeQuery();

            while (rd.next()) {
                Usuarios Usuarios = new Usuarios();
                Usuarios.setId(rd.getInt("id"));
                Usuarios.setNombre(rd.getString("nombre"));
                Usuarios.setPassword(rd.getString("password"));
                Usuarios.setFechacreacion(rd.getString("fechacreacion"));
                Usuarios.setEstado(rd.getBoolean("estado"));
                Usuarios.setPuntosPositivos(rd.getInt("puntospositivos"));
                Usuarios.setPuntosNegativos(rd.getInt("puntosnegativos"));
                Usuarios.setPerfil(ManejadorPerfilesAdministrativos.getInstance().getPerfilAdministrativo(con, rd.getInt("perfil")));

                arregloUsuarios.add(Usuarios);
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Error al tomar los usuarios!", "Error",
                    JOptionPane.WARNING_MESSAGE);
        }

        return arregloUsuarios;
    }
    public ArrayList<Usuarios> getUsuarios(Connection con) {
        ArrayList<Usuarios> arregloUsuarios = new ArrayList();

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from usuarios order by id";

        try {
            state = con.prepareCall(query);
            rd = state.executeQuery();

            while (rd.next()) {
                Usuarios Usuarios = new Usuarios();
                Usuarios.setId(rd.getInt("id"));
                Usuarios.setNombre(rd.getString("nombre"));
                Usuarios.setPassword(rd.getString("password"));
                Usuarios.setFechacreacion(rd.getString("fechacreacion"));
                Usuarios.setEstado(rd.getBoolean("estado"));
                Usuarios.setPuntosPositivos(rd.getInt("puntospositivos"));
                Usuarios.setPuntosNegativos(rd.getInt("puntosnegativos"));
                Usuarios.setPerfil(ManejadorPerfilesAdministrativos.getInstance().getPerfilAdministrativo(con, rd.getInt("perfil")));

                arregloUsuarios.add(Usuarios);
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Error al tomar los usuarios!", "Error",
                    JOptionPane.WARNING_MESSAGE);
        }

        return arregloUsuarios;
    }
public Usuarios getUsuarios(Connection con, String usuario) {
        Usuarios Usuarios = null;

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from usuarios where nombre = ?";

        try {
            state = con.prepareCall(query);
            state.setString(1, usuario);
            rd = state.executeQuery();

            while (rd.next()) {
                Usuarios = new Usuarios();
                Usuarios.setId(rd.getInt("id"));
                Usuarios.setNombre(rd.getString("nombre"));
                Usuarios.setPassword(rd.getString("password"));
                Usuarios.setFechacreacion(rd.getString("fechacreacion"));
                Usuarios.setEstado(rd.getBoolean("estado"));
                Usuarios.setPuntosPositivos(rd.getInt("puntospositivos"));
                Usuarios.setPuntosNegativos(rd.getInt("puntosnegativos"));
                Usuarios.setPerfil(ManejadorPerfilesAdministrativos.getInstance().getPerfilAdministrativo(con, rd.getInt("perfil")));
            }

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }

        return Usuarios;
    }
    public Usuarios getUsuario(Connection con, int codigo) {
        Usuarios Usuarios = null;

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from usuarios where id = ?";

        try {
            state = con.prepareCall(query);
            state.setInt(1, codigo);
            rd = state.executeQuery();

            while (rd.next()) {

                Usuarios = new Usuarios();
                Usuarios.setId(rd.getInt("id"));
                Usuarios.setNombre(rd.getString("nombre"));
                Usuarios.setPassword(rd.getString("password"));
                Usuarios.setFechacreacion(rd.getString("fechacreacion"));
                Usuarios.setEstado(rd.getBoolean("estado"));
                Usuarios.setPuntosPositivos(rd.getInt("puntospositivos"));
                Usuarios.setPuntosNegativos(rd.getInt("puntosnegativos"));
                Usuarios.setPerfil(ManejadorPerfilesAdministrativos.getInstance().getPerfilAdministrativo(con, rd.getInt("perfil")));
            }

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }

        return Usuarios;
    }
public Usuarios getUsuario(Connection con, String usuario) {
        Usuarios Usuarios = null;

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from usuarios where nombre = ?";

        try {
            state = con.prepareCall(query);
            state.setString(1, usuario);
            rd = state.executeQuery();

            while (rd.next()) {
 Usuarios = new Usuarios();
                Usuarios.setId(rd.getInt("id"));
                Usuarios.setNombre(rd.getString("nombre"));
                Usuarios.setPassword(rd.getString("password"));
                Usuarios.setFechacreacion(rd.getString("fechacreacion"));
                Usuarios.setEstado(rd.getBoolean("estado"));
                Usuarios.setPuntosPositivos(rd.getInt("puntospositivos"));
                Usuarios.setPuntosNegativos(rd.getInt("puntosnegativos"));
                Usuarios.setPerfil(ManejadorPerfilesAdministrativos.getInstance().getPerfilAdministrativo(con, rd.getInt("perfil")));
            }

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }

        return Usuarios;
    }
    public boolean insertarUsuario(Connection con, Usuarios Usuarios) {
        PreparedStatement state;

        String query = "insert into usuarios values(?,?,?,?,?,?,?,?)";
        try {


            state = con.prepareStatement(query);
            state.setInt(1, Usuarios.getId());
            state.setString(2, Usuarios.getNombre());
            state.setString(3, Usuarios.getPassword());
            state.setString(4, Usuarios.getFechacreacion());
            state.setBoolean(5, Usuarios.isEstado());
            state.setInt(6, Usuarios.getPuntosPositivos());
            state.setInt(7, Usuarios.getPuntosNegativos());
            state.setInt(8, Usuarios.getPerfil().getId());


            state.execute();
            return true;
        } catch (SQLException ex) {
            return actualizarUsuario(con, Usuarios);
        }


    }

    public boolean actualizarUsuario(Connection con, Usuarios Usuarios) {
        PreparedStatement state;

        String query = "update Usuarios set nombre = ?,password = ?,fechacreacion = ?,estado = ?,puntospositivos = ?,puntosnegativos = ?,perfil = ? where id = ?";

        try {
            state = con.prepareStatement(query);
            state.setInt(8, Usuarios.getId());
            state.setString(1, Usuarios.getNombre());
            state.setString(2, Usuarios.getPassword());
            state.setString(3, Usuarios.getFechacreacion());
            state.setBoolean(4, Usuarios.isEstado());
            state.setInt(5, Usuarios.getPuntosPositivos());
            state.setInt(6, Usuarios.getPuntosNegativos());
            state.setInt(7, Usuarios.getPerfil().getId());

            state.execute();
            return true;

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return false;
        }


    }
    
    public boolean actualizarPuntajeNegativoUsuario(Connection con, Usuarios usuario) {
        PreparedStatement state;

        String query = "update usuarios set puntosnegativos = puntosnegativos+1 where id = ?";

        try {
            state = con.prepareStatement(query);
            state.setInt(1, usuario.getId());

            state.execute();
            return true;

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return false;
        }


    }
    
        public boolean actualizarPuntajePositivosUsuario(Connection con, Usuarios usuario) {
        PreparedStatement state;

        String query = "update usuarios set puntospositivos = puntospositivos+1 where id = ?";

        try {
            state = con.prepareStatement(query);
            state.setInt(1, usuario.getId());

            state.execute();
            return true;

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return false;
        }


    }
    
    public int getNext(Connection con) {
        try {
            ResultSet rd = null;
            PreparedStatement state;
            String query = "select max(id) as max from usuarios";

            state = con.prepareStatement(query);
            rd = state.executeQuery();

            if (!rd.next()) {
                return 1;
            } else {
                return (rd.getInt("max") + 1);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        return 0;
    }
}
